home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / COPYPART.M < prev    next >
Encoding:
Text File  |  1989-05-24  |  4.3 KB  |  158 lines

  1. MODULE CopyPart;
  2. (*$E MOS *)
  3.  
  4. (*
  5.  * Kopiert gesamte Partition von einem auf ein anderes Laufwerk.
  6.  * Dabei wird rigiros auch der Bootsektor mit den Größeninformationen
  7.  * ohne Änderung kopiert.
  8.  *)
  9.  
  10. FROM SYSTEM IMPORT ADR;
  11.  
  12. FROM SysUtil0 IMPORT VarEqual;
  13.  
  14. FROM BIOS IMPORT DriveMap, DriveSet, RWAbs, BPB, BPBPtr, RW, GetBPB;
  15.  
  16. IMPORT TOSIO;
  17. FROM InOut IMPORT WriteString, WriteCard, WriteLn, GotoXY, WritePg;
  18. IMPORT InOut;
  19.  
  20.  
  21. PROCEDURE drvno (c:CHAR): CARDINAL;
  22.   BEGIN
  23.     RETURN ORD (CAP (c)) - ORD ('A')
  24.   END drvno;
  25.  
  26. TYPE CharSet = SET OF CHAR;
  27.  
  28. VAR sd, dd: CHAR;
  29.     sn, dn: CARDINAL;
  30.     drives: DriveSet;
  31.     p: BPBPtr;
  32.     inf: ARRAY [0..31] OF BPB;
  33.     ch: CHAR;
  34.     l: LONGINT;
  35.     bufbls, blno, restbls, bls: CARDINAL;
  36.     verify: BOOLEAN;
  37.  
  38.  
  39.     buf2, buf: ARRAY [1..32768] OF CARDINAL; (* 2 * 64KB *)
  40.  
  41.  
  42. PROCEDURE info (n: CARDINAL);
  43.   BEGIN
  44.     WriteString ('  Drive ');
  45.     WriteString (CHR (n + ORD ('A')));
  46.     WriteString (':');
  47.     WriteLn;
  48.     WriteString ('  Size: ');
  49.     IF inf[n].clsizb <> 1024 THEN HALT END;
  50.     WriteCard (inf [n].numcl,0);
  51.     WriteString (' KB');
  52.     WriteLn;
  53.   END info;
  54.  
  55.  
  56. BEGIN
  57.   drives:= DriveMap ();
  58.   WriteLn;
  59.   WriteString ('Copy whole partition');
  60.   WriteLn;
  61.   WriteLn;
  62.   
  63.   WriteString ('Source drive      (C-P) ? ');
  64.   InOut.Read (sd); sd:= CAP (sd);
  65.   IF NOT ( sd IN CharSet {'C'..'P'} ) THEN RETURN END;
  66.   IF NOT ( drvno (sd) IN drives ) THEN RETURN END;
  67.   WriteLn;
  68.   
  69.   WriteString ('Destination drive (C-P) ? ');
  70.   InOut.Read (dd); dd:= CAP (dd);
  71.   IF NOT ( dd IN CharSet {'C'..'P'} ) THEN RETURN END;
  72.   IF NOT ( drvno (dd) IN drives ) THEN RETURN END;
  73.   WriteLn;
  74.   
  75.   IF sd = dd THEN RETURN END;
  76.   sn:= drvno (sd);
  77.   dn:= drvno (dd);
  78.   
  79.   p:= GetBPB (sn);
  80.   IF p = NIL THEN WriteString ('Not online'); InOut.Read (ch); RETURN END;
  81.   inf[sn]:= p^;
  82.  
  83.   p:= GetBPB (dn);
  84.   IF p = NIL THEN WriteString ('Not online'); InOut.Read (ch); RETURN END;
  85.   inf[dn]:= p^;
  86.  
  87.   WriteLn;
  88.   WriteString ('Source drive: ');
  89.   WriteLn;
  90.   info (sn);
  91.  
  92.   WriteLn;
  93.   WriteString ('Dest drive: ');
  94.   WriteLn;
  95.   info (dn);
  96.  
  97.   WriteLn;
  98.   WriteString ('Copy (Y/N) ? ');
  99.   InOut.Read (ch);
  100.   IF CAP (ch) <> 'Y' THEN RETURN END;
  101.  
  102.   WriteLn;
  103.   WriteString ('With verify (Y/N) ? ');
  104.   InOut.Read (ch);
  105.   verify:= CAP (ch) = 'Y';
  106.  
  107.   blno:= 0;
  108.   restbls:= inf[sn].numcl * inf[sn].clsiz;
  109.   bufbls:= SHORT (SIZE (buf) DIV 1024L) * inf[sn].clsiz; (* =128 *)
  110.   REPEAT
  111.     GotoXY (0, 17);
  112.     WriteString ('Block no. ');
  113.     WriteCard (blno,0);
  114.     WriteLn;
  115.     WriteString ('Copied: ');
  116.     WriteCard (blno DIV inf[sn].clsiz,4);
  117.     WriteString (' KB');
  118.     WriteLn;
  119.     WriteString ('Left  : ');
  120.     WriteCard (restbls DIV inf[sn].clsiz,4);
  121.     WriteString (' KB');
  122.     bls:= bufbls;
  123.     IF bls > restbls THEN bls:= restbls END;
  124.     l:= RWAbs (Read, ADR (buf), bls, blno, sn);
  125.     IF l # 0L THEN
  126.       WriteLn; WriteString ('Read error on source!'); InOut.Read (ch);
  127.       RETURN
  128.     END;
  129.     LOOP
  130.       l:= RWAbs (Write, ADR (buf), bls, blno, dn);
  131.       IF l # 0L THEN
  132.         WriteLn; WriteString ('Write error!'); InOut.Read (ch);
  133.         RETURN
  134.       END;
  135.       IF NOT verify THEN EXIT END;
  136.       l:= RWAbs (Read, ADR (buf2), bls, blno, dn);
  137.       IF l # 0L THEN
  138.         WriteLn; WriteString ('Read error on destination!'); InOut.Read (ch);
  139.         RETURN
  140.       END;
  141.       IF VarEqual (buf, buf2) THEN
  142.         EXIT
  143.       ELSE
  144.         WriteLn; WriteString ('Verify error! Press ESC to stop, other to retry');
  145.         InOut.Read (ch);
  146.         IF ch = 33C THEN RETURN END;
  147.       END;
  148.     END;
  149.     INC (blno, bls);
  150.     DEC (restbls, bls)
  151.   UNTIL restbls = 0;
  152.   WriteLn;
  153.   WriteString ('Copy completed');
  154.   InOut.Read (ch)
  155. END CopyPart.
  156. ə
  157. (* $FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BE$FFF394BEÇ$00000311T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000B39$00000CB5$00000D6D$00000DA0$00000E3B$00000DF0$00000DCD$00000E33$00000ECF$00000DFD$00000ECF$000008CD$000008F6$00000923$0000092D$00000311ÇÇÇ*)
  158.